/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.tbp.persitence.dao.impl;

import br.com.tbp.exception.PersistenciaException;
import br.com.tbp.model.domain.Boc;
import br.com.tbp.model.domain.Consultor;
import br.com.tbp.persitence.FabricaDePersistencia;
import br.com.tbp.persitence.GerenciadorDeConexao;
import br.com.tbp.persitence.GerenciadorDeQuery;
import br.com.tbp.persitence.dao.BocDao;
import br.com.tbp.persitence.dao.EnderecoDao;
import br.com.tbp.utils.DateUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Diego Freire
 */
public class BocDaoImpl implements BocDao {

    private Connection conn = null;
    private PreparedStatement pr = null;
    private ResultSet rs = null;

    public void adicionar(Boc b) throws PersistenciaException {
        if (b == null) {
            throw new PersistenciaException("Não foi informado o boc a cadastrar.");
        }

        try {
            conn = GerenciadorDeConexao.abreConexao();
            pr = conn.prepareStatement(GerenciadorDeQuery.getQuery("boc.insert"),
                    Statement.RETURN_GENERATED_KEYS);
            pr.setString(1, b.getNome());
            pr.setString(2, b.getCpf());
            pr.setDate(3, DateUtils.dataObjetoParaDataBancoDeDados(b.getDataDeAniversario()));
            pr.setString(4, b.getTelefone1());
            pr.setString(5, b.getTelefone2());
            pr.setString(6, b.getEmail());
            pr.setLong(7, b.getEndereco() != null ? b.getEndereco().getId() : 0);
            pr.setString(8, b.getEndereco() != null ? b.getEndereco().getComplemento() : null);
            pr.setString(9, b.getObservacoes());
            pr.setBytes(10, b.getFoto() != null ? b.getFoto().toByteArray() : null);
            pr.setString(11, b.getRg());

            pr.executeUpdate();

            rs = pr.getGeneratedKeys();
            rs.next();
            long id = rs.getLong(1);
            b.setId(id);

        } catch (SQLException exc) {
            StringBuilder msg = new StringBuilder("Não foi possível cadastrar o boc.");
            msg.append("\nMotivo: ").append(exc.getMessage());
            throw new PersistenciaException(msg.toString());
        } finally {
            GerenciadorDeConexao.fechaConexao(conn, pr, rs);
        }
    }

    public List<Boc> pesquisar() throws PersistenciaException {
        List<Boc> lista = new ArrayList<Boc>();

        try {
            conn = GerenciadorDeConexao.abreConexao();
            pr = conn.prepareStatement(GerenciadorDeQuery.getQuery("boc.select"));
            rs = pr.executeQuery();

            if (rs != null) {
                EnderecoDao endereco_dao = FabricaDePersistencia.createEnderecoDao();
                while (rs.next()) {
                    Boc b = this.criarBoc(rs, endereco_dao);
                    lista.add(b);
                }
            }

        } catch (SQLException exc) {
            StringBuilder msg = new StringBuilder("Não foi possível pesquisar os bocs.");
            msg.append("\nMotivo: ").append(exc.getMessage());
            throw new PersistenciaException(msg.toString());
        } finally {
            GerenciadorDeConexao.fechaConexao(conn, pr, rs);
        }

        return lista;
    }

    private Boc criarBoc(ResultSet rs, EnderecoDao endereco_dao) throws PersistenciaException {
        Boc b = null;
        try {
            b = new Boc(rs.getLong("id_boc"));
            b.setNome(rs.getString("nome"));
            b.setCpf(rs.getString("cpf"));
            b.setDataDeAniversario(DateUtils.dataBancoDeDadosParaDataObjeto(rs.getDate("data_aniversario")));
            b.setTelefone1(rs.getString("telefone1"));
            b.setTelefone2(rs.getString("telefone2"));
            b.setEmail(rs.getString("email"));
            b.setEndereco(endereco_dao.pesquisar(rs.getLong("id_endereco")));
            if (b.getEndereco() != null) {
                b.getEndereco().setComplemento(rs.getString("complemento"));
            }
            b.setObservacoes(rs.getString("observacoes"));
            b.setAtivo(rs.getBoolean("ativo"));
            b.setRg(rs.getString("rg"));
        } catch (SQLException sqlex) {
            StringBuilder msg = new StringBuilder("Não foi possível obter os dados do boc.");
            msg.append("\nMotivo: ").append(sqlex.getMessage());
            throw new PersistenciaException(msg.toString());
        }
        return b;
    }

    public void atualizar(Boc b) throws PersistenciaException {
        if (b == null) {
            throw new PersistenciaException("Não foi informado o boc a atualizar.");
        }

        try {
            conn = GerenciadorDeConexao.abreConexao();
            pr = conn.prepareStatement(GerenciadorDeQuery.getQuery("boc.update"));
            pr.setString(1, b.getNome());
            pr.setString(2, b.getCpf());
            pr.setDate(3, DateUtils.dataObjetoParaDataBancoDeDados(b.getDataDeAniversario()));
            pr.setString(4, b.getTelefone1());
            pr.setString(5, b.getTelefone2());
            pr.setString(6, b.getEmail());
            pr.setLong(7, b.getEndereco() != null ? b.getEndereco().getId() : 0);
            pr.setString(8, b.getEndereco() != null ? b.getEndereco().getComplemento() : null);
            pr.setString(9, b.getObservacoes());
            pr.setBytes(10, b.getFoto() != null ? b.getFoto().toByteArray() : null);
            pr.setBoolean(11, b.isAtivo());
            pr.setString(12, b.getRg());
            pr.setLong(13, b.getId());

            pr.executeUpdate();
        } catch (SQLException exc) {
            StringBuilder msg = new StringBuilder("Não foi possível atualizar o boc.");
            msg.append("\nMotivo: ").append(exc.getMessage());
            throw new PersistenciaException(msg.toString());
        } finally {
            GerenciadorDeConexao.fechaConexao(conn, pr);
        }
    }

    public void remover(Boc b) throws PersistenciaException {
        if (b == null) {
            throw new PersistenciaException("Não foi informado o boc a remover.");
        }

        try {
            conn = GerenciadorDeConexao.abreConexao();
            pr = conn.prepareStatement(GerenciadorDeQuery.getQuery("boc.delete"));
            pr.setLong(1, b.getId());

            pr.executeUpdate();
        } catch (SQLException exc) {
            StringBuilder msg = new StringBuilder("Não foi possível remover o boc.");
            msg.append("\nMotivo: ").append(exc.getMessage());
            throw new PersistenciaException(msg.toString());
        } finally {
            GerenciadorDeConexao.fechaConexao(conn, pr);
        }
    }

    public List<Boc> pesquisar(String nome) throws PersistenciaException {
        List<Boc> lista = new ArrayList<Boc>();

        try {
            conn = GerenciadorDeConexao.abreConexao();
            pr = conn.prepareStatement(GerenciadorDeQuery.getQuery("boc.select.nome"));
            pr.setString(1, "%" + nome + "%");
            rs = pr.executeQuery();

            if (rs != null) {
                EnderecoDao endereco_dao = FabricaDePersistencia.createEnderecoDao();
                while (rs.next()) {
                    Boc b = this.criarBoc(rs, endereco_dao);
                    lista.add(b);
                }
            }

        } catch (SQLException exc) {
            StringBuilder msg = new StringBuilder("Não foi possível pesquisar os bocs.");
            msg.append("\nMotivo: ").append(exc.getMessage());
            throw new PersistenciaException(msg.toString());
        } finally {
            GerenciadorDeConexao.fechaConexao(conn, pr, rs);
        }

        return lista;
    }

    public Boc pesquisar(long id) throws PersistenciaException {
        Boc b = null;

        try {
            conn = GerenciadorDeConexao.abreConexao();
            pr = conn.prepareStatement(GerenciadorDeQuery.getQuery("boc.select.id"));
            pr.setLong(1, id);
            rs = pr.executeQuery();

            if (rs != null) {
                if (rs.first()) {
                    EnderecoDao endereco_dao = FabricaDePersistencia.createEnderecoDao();
                    b = this.criarBoc(rs, endereco_dao);
                }
            }

        } catch (SQLException exc) {
            StringBuilder msg = new StringBuilder("Não foi possível pesquisar os bocs.");
            msg.append("\nMotivo: ").append(exc.getMessage());
            throw new PersistenciaException(msg.toString());
        } finally {
            GerenciadorDeConexao.fechaConexao(conn, pr, rs);
        }

        return b;
    }

    public byte[] getFoto(long id) throws PersistenciaException {
        byte[] foto = null;

        try {
            conn = GerenciadorDeConexao.abreConexao();
            pr = conn.prepareStatement(GerenciadorDeQuery.getQuery("boc.select.foto"));
            pr.setLong(1, id);
            rs = pr.executeQuery();

            if (rs != null) {
                if (rs.first()) {
                    foto = rs.getBytes("foto");
                }
            }

        } catch (SQLException exc) {
            StringBuilder msg = new StringBuilder("Não foi possível recuperar a foto do boc.");
            msg.append("\nMotivo: ").append(exc.getMessage());
            throw new PersistenciaException(msg.toString());
        } finally {
            GerenciadorDeConexao.fechaConexao(conn, pr, rs);
        }

        return foto;
    }

    public List<Boc> pesquisar(int limit1, int limit2) throws PersistenciaException {
        List<Boc> lista = new ArrayList<Boc>();

        try {
            conn = GerenciadorDeConexao.abreConexao();
            pr = conn.prepareStatement(GerenciadorDeQuery.getQuery("boc.select.limit"));
            pr.setInt(1, limit1);
            pr.setInt(2, limit2);
            rs = pr.executeQuery();

            if (rs != null) {
                EnderecoDao endereco_dao = FabricaDePersistencia.createEnderecoDao();
                while (rs.next()) {
                    Boc b = this.criarBoc(rs, endereco_dao);
                    lista.add(b);
                }
            }

        } catch (SQLException exc) {
            StringBuilder msg = new StringBuilder("Não foi possível pesquisar os bocs.");
            msg.append("\nMotivo: ").append(exc.getMessage());
            throw new PersistenciaException(msg.toString());
        } finally {
            GerenciadorDeConexao.fechaConexao(conn, pr, rs);
        }

        return lista;
    }
}
